package com.zp.self.module.level_4_算法练习.数据结构.二叉树;

/**
 * @author By ZengPeng
 */
public class 力扣_606_根据二叉树创建字符串 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_606_根据二叉树创建字符串().tree2str(TreeNode.initRoot()));
    }

    /**
    题目：你需要采用前序遍历的方式，将一个二叉树转换成一个由括号和整数组成的字符串。
        空节点则用一对空括号 "()" 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

     示例 1:
     输入: 二叉树: [1,2,3,4]
            1
        /   \
       2    3
     /
    4
     输出: "1(2(4))(3)"
     解释: 原本将是“1(2(4)())(3())”，
     在你省略所有不必要的空括号对之后，
     它将是“1(2(4))(3)”。

     示例 2:
     输入: 二叉树: [1,2,3,null,4]
        1
     /   \
     2     3
     \
     4
     输出: "1(2()(4))(3)"
     解释: 和第一个示例相似，
     除了我们不能省略第一个对括号来中断输入和输出之间的一对一映射关系。

    分析：【P 💚💜】
       1.深度优先遍历: 诶 好像没什么好说的 哈哈哈哈哈
        --执行用时：1 ms, 在所有 Java 提交中击败了100.00%的用户

    边界值 & 注意点：
       1.
     **/
    public String tree2str(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        dfs(root,sb);
        return sb.toString();
    }

    private void dfs(TreeNode root, StringBuilder sb) {
        if(root==null) return;
        sb.append(root.val);
        if(root.left!=null){
            sb.append("(");
            dfs(root.left,sb);
            sb.append(")");
        }
        if(root.right !=null){
            if(root.left==null)
                sb.append("()");
            sb.append("(");
            dfs(root.right,sb);
            sb.append(")");
        }
    }
}
